package com.eian.boot.common.id.model;

import lombok.Data;

import java.util.concurrent.atomic.AtomicLong;

/**
 * 内存号段对象
 * 用于缓存从DB或Redis获取的ID号段
 *
 * @author alex.meng
 */
@Data
public class Segment {

    /**
     * 业务类型
     */
    private String bizType;

    /**
     * 当前值（原子操作）
     */
    private AtomicLong current;

    /**
     * 最大值（不含）
     */
    private long max;

    /**
     * 创建号段对象
     *
     * @param bizType 业务类型
     * @param current 起始值
     * @param max     最大值（不含）
     * @return 号段对象
     */
    public static Segment create(String bizType, long current, long max) {
        Segment segment = new Segment();
        segment.setBizType(bizType);
        segment.setCurrent(new AtomicLong(current));
        segment.setMax(max);
        return segment;
    }

    /**
     * 检查是否还有可用ID
     *
     * @return 是否有可用ID
     */
    public boolean hasNext() {
        return current.get() < max;
    }

    /**
     * 获取下一个ID
     *
     * @return 下一个ID，如果超出范围返回null
     */
    public Long getNextId() {
        long nextId = current.incrementAndGet();
        if (nextId <= max) {
            return nextId;
        }
        return null;
    }
}

